<?php
namespace App\Common\Cla\ClaBase\Traits\DataModel;

use App\Common as com;

trait QuickGetDataUnit {

	private $_quickGetDataUnit_ModelClass = [];

	private $_quickGetDataUnit_Where = [];

	private $_quickGetDataUnit_DataCache = null;

	/**
	 * 初始化QuickGetDataUnit
	 * @param string $modelClass 模型名（带命名空间路径）
	 * @param \Closure|array $where where条件，支持闭包
	 */
	protected function _quickGetDataUnit_InitQuickGetDataUnit( $modelClass, $where ){
		$this->_quickGetDataUnit_ModelClass = $modelClass;
		$this->_quickGetDataUnit_Where = $where;
	}

	/**
	 * 获取where
	 * @return array
	 */
	private function _quickGetDataUnit_GetWhere(  ) {
		if( $this->_quickGetDataUnit_Where instanceof \Closure ){
			return ($this->_quickGetDataUnit_Where)();
		}else{
			return $this->_quickGetDataUnit_Where;
		}
	}

	/**
	 * @return com\Model\TpModelBase
	 */
	private function _quickGetDataUnit_getModelClass(  ) {
		return $this->_quickGetDataUnit_ModelClass;
	}

	/**
	 * 是否存在直属数据
	 * @return bool
	 */
	public function isExistsDirectData(  ):bool {
		try{
			$this->_quickGetDataUnit_GetWhere();
			return true;
		}catch ( \Exception $e ){
			return false;
		}
	}

	/**
	 * 获取直属数据
	 * @param array|string $field 返回字段
	 * @return array|string|null [null]数据不存在 [obj]一行数据 (表：sma_wx_direct_account_users)
	 */
	public function getDirectData( $field = [] ) {
		return $this->_quickGetDataUnit_GetData()->dataEmptyThrowFail()->getData( $field );
	}

	/**
	 * 获取直属数据
	 * @param array|string $field 返回字段
	 * @return array|string|null [null]数据不存在 [obj]一行数据 (表：sma_wx_direct_account_users)
	 */
	public function getDirectDataOfCache( $field = [], bool $isForce = false ) {
		// 获取数据
		if ( $this->_quickGetDataUnit_DataCache === null || $isForce === true ) {
			$this->_quickGetDataUnit_DataCache = $this->_quickGetDataUnit_GetData()->dataEmptyThrowFail()->getData();
		}
		// 检查数据是否存在
		if ( $this->_quickGetDataUnit_DataCache === null ) {
			throw com\Lib\Err\Exception::makeOfNew( '', com\Lib\Err\Code::$sysDataNotExist );
		}
		// 返回数据
		if ( $field === [] ) {
			// 全部返回
			return $this->_quickGetDataUnit_DataCache;
		} else if( is_array( $field ) ){
			// 部分返回
			$matchData = com\Lib\Fun\Array_::assignField( $this->_quickGetDataUnit_DataCache, $field );
			if( count( $field ) !== count( $matchData ) ) {
				throw com\Lib\Err\Exception::makeOfNew( 'field数量不匹配', com\Lib\Err\Code::$sysDataNotExist );
			}
			return $matchData;
		} else {
			// 指定返回
			return $this->_quickGetDataUnit_DataCache[ $field ];
		}
	}

	/**
	 * 保存直属数据
	 * @param array $saveData 保存的数据
	 * @param bool $isCreate 是否为创建。[false][默认]更新 [true]创建
	 * @return object [obj]保存成功，返回对象
	 * @throws
	 */
	public function saveDirectData( array $saveData, bool $isCreate = false ) {
		return $this->_quickGetDataUnit_getModelClass()::saveData( $saveData, $isCreate ? null : $this->_quickGetDataUnit_GetWhere() );
	}

	/**
	 * 获取直属quickGetDataObj
	 * @param array $param @see com\Cla\Base\Fun\QuickGetData param参数
	 * @return com\Cla\Base\Fun\QuickGetData
	 */
	protected function _quickGetDataUnit_GetData( ) {
		$table_query = (new com\Cla\Model\Fun\QuickGetData( $this->_quickGetDataUnit_getModelClass(), [] ));
		$table_query->getModelObj()->where( $this->_quickGetDataUnit_GetWhere() );
		return $table_query;
	}
}
